package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import modeloDatos.Servicio;

public class DAOServiciosPresupuesto {
private Connection conn;
	
	public DAOServiciosPresupuesto() {
    	
    }	
	public void finalize(){
		ConnectionManager.getInstance().checkIn(conn);
    }

	public List<Servicio> serviciosExistentes(){
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "SELECT * FROM tiposservicio";
        ResultSet result = null;
        List<Servicio> servicios = new LinkedList<Servicio>();
		try {
			stmt = conn.prepareStatement(sql);
			result = stmt.executeQuery();
			while (result.next()) {
				Integer idtS = result.getInt("idTipoServicio");
				String d = result.getString("descripcion");
				Integer iva = result.getInt("IVA");
				servicios.add(new Servicio(idtS, d, iva));
			}
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
		} finally {
			finalize();
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
		return servicios;
	}
	public Servicio getServicio(int idServicio){
		
		Servicio servicio = null;
		
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "SELECT s.idServicio, s.idPresupuesto, s.idTipoServicio, s.idValor, ts.IVA, s.conceptos, s.subTotal, ts.descripcion, v.descripcion " +
				"FROM serviciospresupuesto s, tiposservicio ts, valor v " +
				"WHERE s.idTipoServicio=ts.idTipoServicio AND  s.idValor=v.idValor AND  s.idServicio=?";
		
		try{
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idServicio);
			
			ResultSet rs = stmt.executeQuery();
			if(rs.next()){
				int idPresupuesto = rs.getInt("idPresupuesto");
				int idTipoServicio = rs.getInt("idTipoServicio");
				int idValor = rs.getInt("idValor");
				String conceptos = rs.getString("conceptos");
				float subTotal = rs.getFloat("subTotal");
				int IVA = rs.getInt("IVA");
				String tipoServicio = rs.getString(8);
				String tipoValor = rs.getString(9);
				servicio = new Servicio(idServicio,idPresupuesto,tipoServicio,idTipoServicio,idValor,tipoValor,conceptos,subTotal,IVA);
				
			}
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		}finally{
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }					
		}
		return servicio;
	}
	
	public List<Servicio> getServicios(int idPresupuesto){
		//devuelve una lista con todos los presupuestos asociados a un cliente/empresa
		List<Servicio> servicios = new ArrayList<Servicio>();
		
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "SELECT s.idServicio, s.idPresupuesto, s.idTipoServicio, s.idValor, s.conceptos, s.subTotal, ts.IVA, ts.descripcion, v.descripcion " +
				"FROM serviciospresupuesto s, tiposservicio ts, valor v " +
				"WHERE s.idTipoServicio=ts.idTipoServicio AND  s.idValor=v.idValor AND  s.idPresupuesto=?";
		
		try{
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idPresupuesto);
			
			ResultSet rs = stmt.executeQuery();
			while(rs.next()){
				int idServicio = rs.getInt("idServicio");
				int idTipoServicio = rs.getInt("idTipoServicio");
				int idValor = rs.getInt("idValor");
				String conceptos = rs.getString("conceptos");
				float subTotal = rs.getFloat("subTotal");
				int IVA = rs.getInt("IVA");
				String tipoServicio = rs.getString(8);
				String tipoValor = rs.getString(9);
				Servicio serv = new Servicio(idServicio,idPresupuesto,tipoServicio,idTipoServicio,idValor,tipoValor,conceptos,subTotal,IVA);
				
				servicios.add(serv);
			}
		}catch(SQLException e){
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		}finally{
        	finalize();
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }					
		}
		return servicios;
	}
	public String insertarServicio(int idpresupuesto,int idServicio, String conceptos, float subTotal, int idValor) {
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "INSERT INTO serviciospresupuesto(idServicio, idPresupuesto,idTipoServicio,conceptos,subTotal, idValor) VALUES (NULL,?,?,?,?,?)";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idpresupuesto);
			
			stmt.setInt(2, idServicio);
			stmt.setString(3, conceptos);
			stmt.setFloat(4, subTotal);
			
			stmt.setInt(5, idValor);
			stmt.executeUpdate();
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
			return "ERROR al interaccionar con la base de datos";
		} finally {
			finalize();
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
		return "";
	}

	public String insertarServicio(int idpresupuesto,
			int idServicio, int idValor) {
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "INSERT INTO serviciospresupuesto(idServicio, idPresupuesto,idTipoServicio, idValor) VALUES (NULL,?,?,?)";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idpresupuesto);
			
			stmt.setInt(2, idServicio);
			stmt.setInt(3, idValor);
			stmt.executeUpdate();
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
			return "ERROR al interaccionar con la base de datos";
		} finally {
			finalize();
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
		return "";
	}
	
	public boolean modificarServicio(int idServicio, int valor){
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "UPDATE serviciospresupuesto SET idValor=? WHERE idServicio = ?";
		try {
			stmt = conn.prepareStatement(sql);
			
			stmt.setInt(1, valor);
			stmt.setInt(2, idServicio);
			stmt.execute();
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
		} finally {
			finalize();
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
		return true;
	}
	public boolean eliminarServicio(int idServicio) {
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "DELETE FROM serviciospresupuesto WHERE idServicio = ?";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idServicio);
			stmt.executeUpdate();
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
		} finally {
			finalize();
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
		return true;
		
	}
	
	public void actualizarTotal(int idServicio, float total){
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "UPDATE serviciospresupuesto SET subTotal=? WHERE idServicio=?";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setFloat(1, total);
			stmt.setInt(2,idServicio);
			stmt.execute();
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
		} finally {
			finalize();
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
	}
	
	public boolean editarConceptos(int idServicio, String conceptos){
		conn = ConnectionManager.getInstance().checkOut();
		PreparedStatement stmt = null;
		String sql = "UPDATE serviciospresupuesto SET conceptos=? WHERE idServicio=?";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, conceptos);
			stmt.setInt(2, idServicio);
			stmt.execute();
		} catch (SQLException ex) {
			System.out.println("Message: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("ErrorCode: " + ex.getErrorCode());
		} finally {
			finalize();
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException ex) {
			}
		}
		return true;
	}
}
